package com.AllenDuke.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;

import com.AllenDuke.tx.TransactionManger;

import lombok.Setter;

//jdk动态代理类
@SuppressWarnings(value = { "all" }) // 忽略警告
public class EmployeeServiceProxy implements InvocationHandler {

	@Setter
	private Object target;// 真实对象
	@Setter
	private TransactionManger tm;// 业务能力

	// 创建一个代理对象
	public <T> T getProxy() {

		/*
		 * return (T) Proxy.newProxyInstance( // 类加载器，一般跟上真实对象的类加载器
		 * target.getClass().getClassLoader(), // 真实对象所实现的接口，jdk动态代理必须要求真实对象有接口
		 * target.getClass().getInterfaces(), // 事务增强的对象 this);
		 */
		return (T) Enhancer.create(target.getClass(), this);// 继承的类，,事务增强的对象,cjlib动态代理
	}

	// 代理对象，当前真实对象的接口的方法及其参数
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println(proxy.getClass());
		tm.begin();
		try {
			// 使用当前参数,调用真实对象的实际方法=当前方法save
			method.invoke(target, args);
			// 当前参数+1,实际方法=当前方法save+1=update
			// method.invoke(target, args+"1");
			tm.commit();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			tm.rollback();

		}

		return null;
	}

}
